package cn.ad.server.web.log;

import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.TimestampMessage;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * Adserver 业务事件日志消息
 * @author Wu Chengjun
 */
public class AdEventMessage implements Message, TimestampMessage{
	/**
	 * 默认的字段分隔符号
	 */
	private final static String DEFAULT_SEPARATOR = "|";

	/**
	 * 日志处理时间
	 */
	private long eventtime;
	
	/**
	 * 事件日志记录字段
	 * 当字段值为空的时候一定要传入一个占位NULL对象用于记录
	 */
	private List<Object> fileds = new LinkedList<>();
	
	/**
	 * 字段分隔符号
	 */
	private String separator = DEFAULT_SEPARATOR;
	
	
	public AdEventMessage() {
		this(System.currentTimeMillis());
	}
	
	/**
	 * 构造方法
	 * @param eventtime 时间戳
	 */
	public AdEventMessage(Long eventtime){
		this(eventtime, DEFAULT_SEPARATOR);
	}
	
	/**
	 * 构造方法
	 * @param fileds 需要写入的日志字段
	 */
	public AdEventMessage(Object...fileds){
		this(null, DEFAULT_SEPARATOR, fileds);
	}
	
	/**
	 * 构造方法
	 * @param eventtime
	 * @param fileds
	 */
	public AdEventMessage(Long eventtime, Object...fileds) {
		this(eventtime, DEFAULT_SEPARATOR, fileds);
	}
	
	/**
	 * 构造方法
	 * @param eventtime 事件发生时间，当传入的参数为NULL时，将采用系统默认当前时间,
	 * @param separator 字段之间的分隔符号
	 * @param fileds 需要写入的事件字段
	 */
	public AdEventMessage(Long eventtime, String separator, Object...fileds) {
		this.eventtime = eventtime == null ? System.currentTimeMillis() : eventtime;
		if(fileds != null){
			this.fileds = Arrays.asList(fileds);
		}
		this.separator = separator == null ? DEFAULT_SEPARATOR : separator;
	}
	
	@Override
	public String getFormattedMessage() {
		if(fileds != null){
			StringBuilder sb = new StringBuilder();
			for(Object field : fileds){
				sb.append(separator)
				  .append(field == null ? "" : field.toString());
			}
			return sb.toString();
		}
		return "";
	}

	@Override
	public String getFormat() {
		return null;
	}

	@Override
	public Object[] getParameters() {
		return null;
	}

	@Override
	public Throwable getThrowable() {
		return null;
	}

	@Override
	public long getTimestamp() {
		return this.eventtime;
	}
	
	
}
